import java.util.StringJoiner;
//stringBuilder和StringJoiner是特殊的容器但不是集合，也可以说是工具类
public class stringBuilderJoiner {
    public static void main(String[] args) {
        //对于String，s=s1+s2+s3+s4+s5这种操作，会在堆区中开辟很多空间，效率低
        //所以可以使用StringBuilder，它是一个可变的字符串，在堆区中只开辟一个空间，效率高
        StringBuilder q = new StringBuilder();
        q.append("hello");//append() 方法添加元素
        q.append("world");
        q.append("!");
        q.reverse();//反转
        System.out.println(q);//跟String一样，输出的是值，不是地址

        System.out.println(q.length());//lengtjh() 方法返回字符串的长度

        //StringBuilder只是一个容器，不是类型，所以要转换为String类型
        String s = q.toString();
        System.out.println(s);

        //链式编程
        //当我们调用一个方法时，不需要用变量接受，而是依赖前一个方法的结果继续调用，这种方式就是链式编程
        String e = new StringBuilder("hello").append("world").append("!").reverse().toString();
        e = e.substring(0).replace("!", "傻逼");
	/*substring()从索引0开始截取(在加一个数表示截止范围，一个数从当前索引开始到结束)
      replace()将!替换为傻逼*/
        System.out.println("\n" + e + "\n");


        //当我们想一键格式化一个字符串形式时候，每次用append()太麻烦了
        //可以用StringJoiner来构造
        StringJoiner sj = new StringJoiner(",");//每次添加后，会自动在间隔添加一个逗号
        sj.add("a").add("b").add("c");//add() 方法添加元素
        System.out.println(sj); // a,b,c

        StringJoiner sj2 = new StringJoiner(",", "[", "]");
        //第一个参数是间隔符，第二个参数是开头，第三个参数是结尾
        sj2.add("a").add("b").add("c");
        System.out.println(sj2); // [a,b,c]

        System.out.println(sj2.length());//length() 方法返回字符串的长度

        String t1 = sj2.toString();//一样，StringJoiner也是一个容器，不是类型，所以要转换为String类型
        System.out.println(t1);
	
	/*内存知识：
	对于只有常量拼接的字符串，会在字符串常量池中开辟空间，会复用串池里的字符串
	对于有变量拼接的字符串，每次都会在堆区中开辟空间，所以很慢
	StringBuilder一开始在堆区中开辟了一个16字节的char数组，大于16字节时，会自动扩容，减少每次扩容的次数
	* */
    }
}
